#include "headers/irq.h"
#include "headers/idt.h"
#include "../tools/headers/common.h"
#include "../api/headers/io.h"
extern interrupt_handlers[256];
void irq_0();
void irq_1();
void irq_2();
void irq_3();
void irq_4();
void irq_5();
void irq_6();
void irq_7();
void irq_8();
void irq_9();
void irq_10();
void irq_11();
void irq_12();
void irq_13();
void irq_14();
void irq_15();

void install_irqs()
{
	idt_set_gate(IRQ0, (u32int)irq_0, 0x08, 0x8E);
	idt_set_gate(IRQ1, (u32int)irq_1, 0x08, 0x8E);
	idt_set_gate(IRQ2, (u32int)irq_2, 0x08, 0x8E);
	idt_set_gate(IRQ3, (u32int)irq_3, 0x08, 0x8E);
	idt_set_gate(IRQ4, (u32int)irq_4, 0x08, 0x8E);
	idt_set_gate(IRQ5, (u32int)irq_5, 0x08, 0x8E);
	idt_set_gate(IRQ6, (u32int)irq_6, 0x08, 0x8E);
	idt_set_gate(IRQ7, (u32int)irq_7, 0x08, 0x8E);
	idt_set_gate(IRQ8, (u32int)irq_8, 0x08, 0x8E);
	idt_set_gate(IRQ9, (u32int)irq_9, 0x08, 0x8E);
	idt_set_gate(IRQ10, (u32int)irq_10, 0x08, 0x8E);
	idt_set_gate(IRQ11, (u32int)irq_11, 0x08, 0x8E);
	idt_set_gate(IRQ12, (u32int)irq_12, 0x08, 0x8E);
	idt_set_gate(IRQ13, (u32int)irq_13, 0x08, 0x8E);
	idt_set_gate(IRQ14, (u32int)irq_14, 0x08, 0x8E);
	idt_set_gate(IRQ15, (u32int)irq_15, 0x08, 0x8E);
}

void irq_handler(registers_type registers)
{
    if (interrupt_handlers[registers.interrupt_number] != 0)
    {
        isr_type handler = interrupt_handlers[registers.interrupt_number];
        handler(registers);
    }
    if (registers.interrupt_number >= 40)
    {
        outb(0xA0, 0x20);
    }
    outb(0x20, 0x20);
}
